<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>匿名函数和闭包</title>
	</head>
	<body>
	</body>
	
	<script>
		 
		 //普通函数
		 function box(){
		 	return 'lee';
		 }
		 alert(box());
		 
		/* //匿名函数
		 function(){
		 	return 'lee'; //匿名函数无法运行，也无法调用
		 }*/
		 
		 
		 //把匿名函数赋值给变量
		 var box1 = function(){
		 	return 'joy';
		 };
		 alert(box1());
		 
		 //通过表达式自我执行匿名函数
		 (function(){  //  格式  :  (匿名函数)() 第一个圆括号放匿名函数，第二个圆括号表示执行
		 	alert('tony') ;
		 })();
		 
		 
		 //把你名函数自我执行的返回值赋给变量
		 var  box2 = (function(){
		 	return 'jock';   
		 	
		 })();
		 alert(box2);
		 
		 
		 //自我执行后用alert 打印
		 alert((function(){
		 	
		 	return 'alert';
		 })());
		  
		  //注意前后函数用;隔开，容易出错
		  
		 //自我执行匿名函数的传参   
		 	      //表达式:   (匿名函数)(参数)
		 (function(age){
		 	alert(age);
		 })(100);
		 
		 
		 
		 //函数里放一个匿名函数
		 function  box3(){
		 	return function(){  //闭包
		 		return '闭包';
		 	}
		 }
		 //直接调用
		 alert(box3()());
		 //赋值调用
		 var b =box3();
		 alert(b());
		 
		 
		//闭包 的特点
		 
		 //通过闭包返回局部变量
		 function bbox(){
		 	var age =18;
		 	return function(){
		 		return age;
		 	};
		 	
		 }
	alert(bbox()())
		 
		 //优点同时也是缺点：把局部变量驻留在内存中，避免使用全局变量
		 
		 //使用全局变量进行累加
		 var  number = 0;
		 function summation(){
		 	number++;
		 }
		 alert(number);//0
		 summation();
		 alert(number);//1
		  summation();
		 	 alert(number);//2
		 	 
		 	 
		 	 
		 //使用局部变量进行累加
		 function summation1(){
		 	var number11 =100; //每次都被初始化 
		 	number11++;
		 	return number11;
		 }
		 //无法累加
		 alert(summation1());//101
		 alert(summation1());//101
		 
		 
		 //使用匿名函数实现局部变量驻留内存中从而累加
		 
		 function summationBox(){
		 	var number12 =10;
		 	return function(){
		 		number12++;
		 		return number12;
		 	};
		 }
		 
		 var s =summationBox();// s拥有闭包函数的作用域，私有变量引用存在，内存不会被释放，不会初始化
		 alert(s());//11
		 alert(s());//12
		 //ps: 由于闭包作用域返回的局部变量资源不会被立刻销毁回收，所以肯能会占用更多的内存。
		 //过度使用闭包会导致性能下降，建议在非常有必要的时候才使用闭包。
		 
		 alert(s);//return function(){number12++;return number12;};
		 s =null;//销毁，解除引用并释放内存
	</script>
</html>
